package com.sample.springbootsample.interceptor;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 定义一个Interceptor 非常简单方式也有几种，这里简单列举两种
 * 1、类要实现Spring 的HandlerInterceptor 接口
 * 2、类继承实现了HandlerInterceptor 接口的类，例如 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInterceptorAdapter
 * preHandle：在业务处理器处理请求之前被调用。预处理，可以进行编码、安全控制、权限校验等处理；
 * postHandle：在业务处理器处理请求执行完成后，生成视图之前执行。后处理（调用了Service并返回ModelAndView，但未进行页面渲染），有机会修改ModelAndView;
 * afterCompletion：在DispatcherServlet完全处理完请求后被调用，可用于清理资源等。对资源进行回收进行处理, 返回处理（已经渲染了页面）;
 *
 * 当我们需要多个拦截器的时候，每个拦截器的方法处理顺序如下：
 * Interceptor1:preHandle > Interceptor2:preHandle > Interceptor2:postHandle > Interceptor1:postHandle >
 * Interceptor2:afterCompletion > Interceptor1:afterCompletion
 * 我们在拦截器配置类InterceptorConfig中添加的顺序就是拦截器执行的顺序
 *
 * 拦截器和AOP的联系与区别
 * 拦截器只对action负责，作用层面一般位于Controller层
 * Spring AOP主要是拦截对Spring管理的Bean的访问，一般作用与Service层
 * Spring AOP和拦截器一样，都是AOP的实现方式的一种，均使用代理模式实现。
 *
 * @projectName: spring-boot-sample
 * @description:
 * @author: Adam
 * @create: 2019-12-11 17:18
 **/

public class InterceptorDemo implements HandlerInterceptor {

    private final Logger logger = LoggerFactory.getLogger(InterceptorDemo.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        logger.info("===>>>完美进入preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        logger.info("===>>>完美进入postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        logger.info("===>>>完美进入afterCompletion");
    }
}
